#include "dequeue.hpp"
#include <iostream>
#include <vector>
#include <thread>
#include <unordered_map>
#include <cassert>
using namespace std;

// // 测试函数
// void testDeQueue() {
//     const int QUEUE_SIZE = 16777216;
//     const int NUM_THREADS = 8;
//     const int NUM_OPS = 10000;

//     DeQueue queue(QUEUE_SIZE);
//     std::vector<std::thread> threads;
//     std::atomic<int> total_pushed(0);
//     std::atomic<int> total_popped(0);

//     // 入队线程函数
//     auto enqueue_func = [&]() {
//         for (int i = 0; i < NUM_OPS; ++i) 
//         {
//             if (queue.push(i)) 
//             {
//                 total_pushed.fetch_add(1, std::memory_order_relaxed);
//             }
//         }
//     };

//     // 出队线程函数
//     auto dequeue_func = [&]() 
//     {
//         for (int i = 0; i < NUM_OPS; ++i)
//          {
//             int val = queue.pop();
//             if (val != -1) {
//                 total_popped.fetch_add(1, std::memory_order_relaxed);
//             }
//         }
//     };

//     // 创建入队和出队线程
//     for (int i = 0; i < NUM_THREADS / 2; ++i) 
//     {
//         threads.emplace_back(enqueue_func);
//         threads.emplace_back(dequeue_func);
//     }

//     // 等待所有线程完成
//     for (auto& t : threads) 
//     {
//         t.join();
//     }

//     // 检查队列状态
//     std::cout << "Total pushed: " << total_pushed.load() << std::endl;
//     std::cout << "Total popped: " << total_popped.load() << std::endl;
//     assert(total_popped.load() <= total_pushed.load());

//     std::cout << "Test passed!" << std::endl;
// }

// int main() 
// {
//     testDeQueue();
//     return 0;
// }


int main()
{
	DeQueue dq(16777216 * 2 * 2);

	vector<thread> threads;
	int threadcount = 8, insertcount = 10000000;

	for (int i = 0; i < threadcount; i++)
	{
		threads.emplace_back([&]() {
			for (int i = 0; i < insertcount; i++)
			{
				dq.push(i);
			}
			});
	}


	for (int i = 0; i < threadcount; i++)
	{
		threads[i].join();
	}

	// unordered_map<int, int> hash;
	// int val = 0;
	// while ((val = dq.pop()) != -1)
	// {
	// 	hash[val]++;
	// }

	// for (auto e : hash)
	// {
	// 	if (e.second != threadcount)
	// 	{
	// 		cout << "线程不安全" << endl;
	// 		return 0;
	// 	}
	// }

	// cout << "线程安全" << endl;
	return 0;
}


//int main()
//{
//	DeQueue dq(8);
//
//	for (int i = 0; i < 9; i++)
//	{
//		if (dq.push(i))
//		{
//			std::cout << "插入成功" << std::endl;
//		}
//		else
//		{
//			std::cout << "插入失败" << std::endl;
//		}
//	}
//
//	for (int i = 0; i < 8; i++)
//	{
//		int val = dq.pop();
//		if (val == -1)
//		{
//			std::cout << "队列为空" << std::endl;
//		}
//		else
//		{
//			std::cout << "获取成功：" << val << std::endl;
//		}
//	}
//
//	return 0;
//}